package demo.shardingspere.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * Mybatis Plus 配置
 *
 * @author ruoyi
 */
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
// 指定要扫描的Mapper类的包的路径
public class MybatisPlusConfig
{
//    @Bean
//    @ConfigurationProperties(prefix = "spring.datasource")
//    public DataSource dataSource(){
//        List<Filter> filterList = null;
//        DruidDataSource druidDataSource = new DruidDataSource();
//        List<Filter> proxyFilters = druidDataSource.getProxyFilters();
//        boolean isExit = false;
//        for(Filter filter:proxyFilters){
//            if(filter instanceof WallFilter){
//                ((WallFilter) filter).setConfig(wallConfig());
//                isExit = true;
//            }
//        }
//        if(!isExit){
//            filterList= new ArrayList<>();
//            filterList.add(wallFilter());
//            druidDataSource.setProxyFilters(filterList);
//        }
//        return druidDataSource;
//
//    }
//
//    @Bean
//    public WallFilter wallFilter(){
//        WallFilter wallFilter = new WallFilter();
//        wallFilter.setDbType(DbType.MYSQL.getDb());
//        wallFilter.setConfig(wallConfig());
//        return wallFilter;
//
//    }
//
//    @Bean
//    public WallConfig wallConfig(){
//        WallConfig config = new WallConfig();
//        config.setMultiStatementAllow(true);//允许一次执行多条语句
//        config.setNoneBaseStatementAllow(true); //允许非基本语句的其他语句
//        return config;
//    }

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor()
    {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor());
        // 乐观锁插件
        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
        // 阻断插件
        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
        return interceptor;
    }

    /**
     * 分页插件，自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
     */
    public PaginationInnerInterceptor paginationInnerInterceptor()
    {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置数据库类型为mysql
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        // 设置最大单页限制数量，默认 500 条，-1 不受限制
        // Long _limit = page.maxLimit() != null ? page.maxLimit() : this.maxLimit;
        // 设置成-1会有bug，如page的size属性是-1的时候不进行分页，这里也会默认拼接maxLimit的分页，就会变成limit -1 sql就会报错
        //paginationInnerInterceptor.setMaxLimit(-1L);
        return paginationInnerInterceptor;
    }

    /**
     * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
     */
    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor()
    {
        return new OptimisticLockerInnerInterceptor();
    }

    /**
     * 如果是对全表的删除或更新操作，就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
     */
    public BlockAttackInnerInterceptor blockAttackInnerInterceptor()
    {
        return new BlockAttackInnerInterceptor();
    }
    /**
     * 批量插入
     */
    @Bean
    public ExpandSqlInjector sqlInjector() {
        return new ExpandSqlInjector();
    }
}
